package designpattern.proxy.dynamicproxy;

import com.sun.jdi.PathSearchingVirtualMachine;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author 赵乾坤
 * @since 2021-12-04 15:35
 * 需要在代理文件引入第三方 jar包
 * CglibProxy动态代理
 */
public class CglibProxy {

    public static void main(String[] args) {
        // 委托对象
        RentingHouseImpl rentingHouse = new RentingHouseImpl();


        // 使用工厂来获取代理对象
        RentingHouseImpl cglibProxy = (RentingHouseImpl) ProxyFactory.getInstance().getCglibProxy(rentingHouse);
        cglibProxy.rentHosue();


        // 获取rentingHouse对象的代理对象，
        // Enhancer类似于JDK动态代理中的Proxy
        // 通过实现接口MethodInterceptor能够对各个方法进行拦截增强，类似于JDK动态代理中的InvocationHandler
        //参数1： 委托对象业务逻辑，2方法拦截器
    /*   RentingHouseImpl rentingHouseProxy = (RentingHouseImpl) Enhancer.create(rentingHouse.getClass(), new MethodInterceptor() {
            @Override
            // 参数1：代理对象的引用  2.方法的封装和jdk一样 3代理对象方法的封装
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Object result = null;
                System.out.println("中介（代理）收取服务费3000元");
                result = method.invoke(rentingHouse, objects);
                System.out.println("客户信息卖了3毛钱");
                return result;
            }
        });
        rentingHouseProxy.rentHosue();
    */
    }
}
